/**
 * 
 */
package mx.frantor.catalogos.daoimp;

import java.math.BigInteger;
import java.util.List;
import java.util.StringTokenizer;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import flex.messaging.io.ArrayCollection;

import mx.frantor.catalogos.dao.PedidosDAO;
import mx.frantor.catalogos.entitys.DetallePedidoEntity;
import mx.frantor.catalogos.entitys.PedidosEntity;
import mx.frantor.util.HibernateUtil;

/**
 * @author Hp
 *
 */
public class PedidosDAOImpl implements PedidosDAO {

	/* (non-Javadoc)
	 * @see mx.frantor.catalogos.dao.PedidosDAO#agregarPedidos(mx.frantor.catalogos.entitys.PedidosEntity)
	 */
	@Override
	public String agregarPedidos(PedidosEntity nuevoPedidos) {
		// TODO Auto-generated method stub
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		
		session.beginTransaction();
		try {
		session.save(nuevoPedidos);
		session.flush();
		session.getTransaction().commit();
		e = nuevoPedidos.getIdPedido().toString();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("agregar pedidos resultado " + e);

		return e;
	}

	/* (non-Javadoc)
	 * @see mx.frantor.catalogos.dao.PedidosDAO#modificarPedidos(mx.frantor.catalogos.entitys.PedidosEntity)
	 */
	
	@SuppressWarnings("unchecked")
	@Override
	public BigInteger getMaxIdRequisicion() {
		BigInteger max = null;
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		try{
		String qry = "select max(idrequisiciones) as idrequisiciones from requisiciones";
		SQLQuery query = session.createSQLQuery(qry);
		//query.addEntity(Long.class);
		List<BigInteger> requisicion = query.list();
		session.flush();
		max = requisicion.get(0);
		}catch (Exception e) {
			//max=0;
			System.out.println(e.toString());
			e.printStackTrace();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("maxidreqisicion pedidos resultado " + max);

		return max;
	}
	@SuppressWarnings("unchecked")
	@Override
	public BigInteger getMaxConsRequisicion() {
		BigInteger max = null;
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		try{
		String qry = "select max(consecutivo) as consecutivo from requisiciones";
		SQLQuery query = session.createSQLQuery(qry);
		//query.addEntity(Long.class);
		List<BigInteger> requisicion = query.list();
		session.flush();
		max = requisicion.get(0);
		}catch (Exception e) {
			//max=0;
			System.out.println(e.toString());
			e.printStackTrace();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("maxconsrequisiscion pedidos resultado " + max);

		return max;
	}
	@Override
	public String modificarPedidos(PedidosEntity modificarPedidos) {
		// TODO Auto-generated method stub
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
	
		session.beginTransaction();
		try {
			PedidosEntity pedidosTemp = (PedidosEntity) session.get(
					PedidosEntity.class, modificarPedidos.getIdPedido());
		session.flush();
		session.evict(pedidosTemp);
		session.update(modificarPedidos);
		session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("modificar pedidos resultado " + e);

		return e;
	}

	/* (non-Javadoc)
	 * @see mx.frantor.catalogos.dao.PedidosDAO#eliminarPedidos(java.lang.Integer)
	 */
	@Override
	public String eliminarPedidos(long IdPedido) {
		// TODO Auto-generated method stub
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		

			// TODO Auto-generated method stub			
			session.beginTransaction();
			try {
				PedidosEntity PedidosElimina = (PedidosEntity) session.get(
						PedidosEntity.class, IdPedido);
			session.delete(PedidosElimina);
			session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			System.out.println("pedido eliminado implement" + e);
			
			//return e.toString();
		}
		//HibernateUtil.getSessionFactory().getCurrentSession().close();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("eliminar pedidos resultado " + e);

		return e;	
		}

	/* (non-Javadoc)
	 * @see mx.frantor.catalogos.dao.PedidosDAO#getTodosPedidosActivos()
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<PedidosEntity> getTodosPedidosActivos() {
		// TODO Auto-generated method stub
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<PedidosEntity> pedidos = session.createCriteria(PedidosEntity.class)
				.addOrder(Order.asc("IdPedido")).list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return pedidos;
	}

	/* (non-Javadoc)
	 * @see mx.frantor.catalogos.dao.PedidosDAO#getClientesId(java.lang.Integer)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public PedidosEntity getPedidosId(long IdPedido) {
		// TODO Auto-generated method stub
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<PedidosEntity> pedidos = (List<PedidosEntity>) session.createCriteria(PedidosEntity.class)
				.add(Restrictions.eq("IdPedido", IdPedido))
				.setFetchSize(1).list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		if(pedidos==null){
			return null;
		}else{
			return pedidos.get(0);
			}
		}

	/* (non-Javadoc)
	 * @see mx.frantor.catalogos.dao.PedidosDAO#getClientesPorId(java.lang.Integer)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<PedidosEntity> getPedidosPorId(long IdPedido) {
		// TODO Auto-generated method stub
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<PedidosEntity> pedidos = (List<PedidosEntity>) session.createCriteria(PedidosEntity.class)
				.add(Restrictions.eq("IdPedido", IdPedido))
				.list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return pedidos;
	}
	public String agregarPedidosProds(PedidosEntity nuevoPedido, ArrayCollection catProds) {

		String errRslt = "";
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		try{
			session.save(nuevoPedido);//<<---Guardamos en la DB
			long idPedido = nuevoPedido.getIdPedido();
			
			//System.out.println("Size FlexCollection: " + reqUtil.size() + " Vals: " + reqUtil);
			String cantidadMP = null;
			String idProd = null;
			String seri = null;
			String reflector = null;
			String logo = null;
			String idMP = null;
			System.out.println(catProds.size());
			for(int i = 0; i < catProds.size(); i++){
				StringTokenizer token = new StringTokenizer(String.valueOf(catProds.get(i).toString()),"=,");
				System.out.println("empieza detalle pedido");
				while(token.hasMoreTokens()){
					String tok = token.nextToken();
					System.out.println(tok);
					if (tok.contains("MatP")){
						idMP = token.nextToken();
						System.out.println(idMP);
					}
					if (tok.contains("logotipo")){
						logo=(token.nextToken());
						System.out.println(logo);
					}
					if (tok.contains("cantidad")){
						cantidadMP = token.nextToken();
						System.out.println(cantidadMP);
					}
					if (tok.contains("idProducto")){
						idProd = token.nextToken();
						System.out.println(idProd);
					}
					if (tok.contains("reflector")){
						reflector= token.nextToken();
						System.out.println(reflector);
					}
					if (tok.contains("serigrafia")){
						seri=token.nextToken();
						System.out.println(seri);
					}
											
				}			
					DetallePedidoEntity Pedidos = new DetallePedidoEntity();
				if(idMP.equals("NO")){
					System.out.println("prod");
					Pedidos.setIdProducto(Long.valueOf(idProd.replace("}", "")));
					Pedidos.setIdPedido(idPedido);
					Pedidos.setCantidad(Float.valueOf(cantidadMP.replace("}", "")));
					Pedidos.setReflector(reflector.replace("}", ""));
					Pedidos.setLogotipo(logo.replace("}", ""));
					Pedidos.setSerigrafia(seri.replace("}", ""));
					Pedidos.setEstatus("NUEVO");
					session.save(Pedidos);
				}else{
					System.out.println("materia");
					Pedidos.setIdMateria(Long.valueOf(idMP.replace("}", "")));
					System.out.println("El pedido");
					Pedidos.setIdPedido(idPedido);
					Pedidos.setCantidad(Float.valueOf(cantidadMP.replace("}", "")));
					Pedidos.setReflector(reflector.replace("}", ""));
					Pedidos.setLogotipo(logo.replace("}", ""));
					Pedidos.setSerigrafia(seri.replace("}", ""));
					Pedidos.setEstatus("NUEVO");
					session.save(Pedidos);
					}
				
				
			}
			session.flush();
			session.getTransaction().commit();
			 //<--Realizamos commit de operacion en db
		errRslt = "";
		
			
		}catch (Exception e) {
			
	  		session.getTransaction().rollback();
			errRslt = e.getMessage();
			System.out.println("Error en agrega Requisicon con detalle implement: " + errRslt);
			
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println(errRslt);
		return errRslt;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidosEntity> getPedidosPorHViajera(String noHoja) {
		// TODO Auto-generated method stub
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<PedidosEntity> pedidos = (List<PedidosEntity>) session.createCriteria(PedidosEntity.class)
				.add(Restrictions.eq("NoHoja", noHoja))
				.list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return pedidos;
		
	}
	
	
}
